<html>
<head>
<meta charset="utf-8"/>
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
<meta content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no,viewport-fit=cover" name="viewport"/>
<meta content="telephone=no" name="format-detection"/>
<style type="text/css">

#watermark {

  position: relative;
  overflow: hidden;
}

#watermark .x {
  position: absolute;
  top: 800;
  left: 400;
  color: #3300ff;
  font-size: 50px;
  pointer-events: none;
  opacity:0.5;
  filter:Alpha(opacity=50);
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
}
    </style>
<style type="text/css">
 html{color:#333;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-rendering:optimizelegibility;font-family:Helvetica Neue,PingFang SC,Verdana,Microsoft Yahei,Hiragino Sans GB,Microsoft Sans Serif,WenQuanYi Micro Hei,sans-serif}html.borderbox *,html.borderbox :after,html.borderbox :before{box-sizing:border-box}article,aside,blockquote,body,button,code,dd,details,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hr,input,legend,li,menu,nav,ol,p,pre,section,td,textarea,th,ul{margin:0;padding:0}article,aside,details,figcaption,figure,footer,header,menu,nav,section{display:block}audio,canvas,video{display:inline-block}body,button,input,select,textarea{font:300 1em/1.8 PingFang SC,Lantinghei SC,Microsoft Yahei,Hiragino Sans GB,Microsoft Sans Serif,WenQuanYi Micro Hei,Helvetica,sans-serif}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}blockquote{position:relative;color:#999;font-weight:400;border-left:1px solid #1abc9c;padding-left:1em;margin:1em 3em 1em 2em}@media only screen and (max-width:640px){blockquote{margin:1em 0}}abbr,acronym{border-bottom:1px dotted;font-variant:normal}abbr{cursor:help}del{text-decoration:line-through}address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:400}ol,ul{list-style:none}caption,th{text-align:left}q:after,q:before{content:""}sub,sup{font-size:75%;line-height:0;position:relative}:root sub,:root sup{vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}a{color:#1abc9c}a:hover{text-decoration:underline}.typo a{border-bottom:1px solid #1abc9c}.typo a:hover{border-bottom-color:#555;color:#555}.typo a:hover,a,ins{text-decoration:none}.typo-u,u{text-decoration:underline}mark{background:#fffdd1;border-bottom:1px solid #ffedce;padding:2px;margin:0 5px}code,pre,pre tt{font-family:Courier,Courier New,monospace}pre{background:hsla(0,0%,97%,.7);border:1px solid #ddd;padding:1em 1.5em;display:block;-webkit-overflow-scrolling:touch}hr{border:none;border-bottom:1px solid #cfcfcf;margin-bottom:.8em;height:10px}.typo-small,figcaption,small{font-size:.9em;color:#888}b,strong{font-weight:700;color:#000}[draggable]{cursor:move}.clearfix:after,.clearfix:before{content:"";display:table}.clearfix:after{clear:both}.clearfix{zoom:1}.textwrap,.textwrap td,.textwrap th{word-wrap:break-word;word-break:break-all}.textwrap-table{table-layout:fixed}.serif{font-family:Palatino,Optima,Georgia,serif}.typo-dl,.typo-form,.typo-hr,.typo-ol,.typo-p,.typo-pre,.typo-table,.typo-ul,.typo dl,.typo form,.typo hr,.typo ol,.typo p,.typo pre,.typo table,.typo ul,blockquote{margin-bottom:1rem}h1,h2,h3,h4,h5,h6{font-family:PingFang SC,Helvetica Neue,Verdana,Microsoft Yahei,Hiragino Sans GB,Microsoft Sans Serif,WenQuanYi Micro Hei,sans-serif;color:#000;line-height:1.35}.typo-h1,.typo-h2,.typo-h3,.typo-h4,.typo-h5,.typo-h6,.typo h1,.typo h2,.typo h3,.typo h4,.typo h5,.typo h6{margin-top:1.2em;margin-bottom:.6em;line-height:1.35}.typo-h1,.typo h1{font-size:2em}.typo-h2,.typo h2{font-size:1.8em}.typo-h3,.typo h3{font-size:1.6em}.typo-h4,.typo h4{font-size:1.4em}.typo-h5,.typo-h6,.typo h5,.typo h6{font-size:1.2em}.typo-ul,.typo ul{margin-left:1.3em;list-style:disc}.typo-ol,.typo ol{list-style:decimal;margin-left:1.9em}.typo-ol ol,.typo-ol ul,.typo-ul ol,.typo-ul ul,.typo li ol,.typo li ul{margin-bottom:.8em;margin-left:2em}.typo-ol ul,.typo-ul ul,.typo li ul{list-style:circle}.typo-table td,.typo-table th,.typo table caption,.typo table td,.typo table th{border:1px solid #ddd;padding:.5em 1em;color:#666}.typo-table th,.typo table th{background:#fbfbfb}.typo-table thead th,.typo table thead th{background:hsla(0,0%,95%,.7)}.typo table caption{border-bottom:none}.typo-input,.typo-textarea{-webkit-appearance:none;border-radius:0}.typo-em,.typo em,caption,legend{color:#000;font-weight:inherit}.typo-em{position:relative}.typo-em:after{position:absolute;top:.65em;left:0;width:100%;overflow:hidden;white-space:nowrap;content:"\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB\30FB"}.typo img{max-width:100%}.common-content{font-weight:400;color:#353535;line-height:1.75rem;white-space:normal;word-break:normal;font-size:1rem}.common-content img{display:block;max-width:100%;background-color:#eee}.common-content audio,.common-content video{width:100%;background-color:#eee}.common-content center,.common-content font{margin-top:1rem;display:inline-block}.common-content center{width:100%}.common-content pre{margin-top:1rem;padding-left:0;padding-right:0;position:relative;overflow:hidden}.common-content pre code{font-size:.8rem;font-family:Consolas,Liberation Mono,Menlo,monospace,Courier;display:block;width:100%;box-sizing:border-box;padding-left:1rem;padding-right:1rem;overflow-x:auto}.common-content hr{border:none;margin-top:1.5rem;margin-bottom:1.5rem;border-top:1px solid #f5f5f5;height:1px;background:none}.common-content b,.common-content h1,.common-content h2,.common-content h3,.common-content h4,.common-content h5,.common-content strong{font-weight:700}.common-content h1,.common-content h2{font-size:1.125rem;margin-bottom:.45rem}.common-content h3,.common-content h4,.common-content h5{font-size:1rem;margin-bottom:.45rem}.common-content p{font-weight:400;color:#353535;margin-top:.15rem}.common-content .orange{color:#ff5a05}.common-content .reference{font-size:1rem;color:#888}.custom-rich-content h1{margin-top:0;font-weight:400;font-size:15.25px;border-bottom:1px solid #eee;line-height:2.8}.custom-rich-content li,.custom-rich-content p{font-size:14px;color:#888;line-height:1.6}table.hljs-ln{margin-bottom:0;border-spacing:0;border-collapse:collapse}table.hljs-ln,table.hljs-ln tbody,table.hljs-ln td,table.hljs-ln tr{box-sizing:border-box}table.hljs-ln td{padding:0;border:0}table.hljs-ln td.hljs-ln-numbers{min-width:15px;color:rgba(27,31,35,.3);text-align:right;white-space:nowrap;cursor:pointer;user-select:none}table.hljs-ln td.hljs-ln-code,table.hljs-ln td.hljs-ln-numbers{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:12px;line-height:20px;vertical-align:top}table.hljs-ln td.hljs-ln-code{position:relative;padding-right:10px;padding-left:10px;overflow:visible;color:#24292e;word-wrap:normal;white-space:pre}video::-webkit-media-controls{overflow:hidden!important}video::-webkit-media-controls-enclosure{width:calc(100% + 32px);margin-left:auto}.button-cancel{color:#888;border:1px solid #888;border-radius:3px;margin-right:12px}.button-cancel,.button-primary{-ms-flex-positive:1;flex-grow:1;height:35px;display:inline-block;font-size:15px;text-align:center;line-height:36px}.button-primary{color:#fff;background-color:#ff5a05;border-radius:3px}@font-face{font-family:iconfont;src:url(//at.alicdn.com/t/font_372689_bwwwtosxtzp.eot);src:url(//at.alicdn.com/t/font_372689_bwwwtosxtzp.eot#iefix) format("embedded-opentype"),url(//at.alicdn.com/t/font_372689_bwwwtosxtzp.woff) format("woff"),url(//at.alicdn.com/t/font_372689_bwwwtosxtzp.ttf) format("truetype"),url(//at.alicdn.com/t/font_372689_bwwwtosxtzp.svg#iconfont) format("svg")}@font-face{font-family:player-font;src:url(//at.alicdn.com/t/font_509397_1cyjv4o90qiod2t9.eot);src:url(//at.alicdn.com/t/font_509397_1cyjv4o90qiod2t9.eot#iefix) format("embedded-opentype"),url(//at.alicdn.com/t/font_509397_1cyjv4o90qiod2t9.woff) format("woff"),url(//at.alicdn.com/t/font_509397_1cyjv4o90qiod2t9.ttf) format("truetype"),url(//at.alicdn.com/t/font_509397_1cyjv4o90qiod2t9.svg#player-font) format("svg")}.iconfont{font-family:iconfont!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:.2px;-moz-osx-font-smoothing:grayscale}html{background:#fff;min-height:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{width:100%}body.fixed{overflow:hidden;position:fixed;width:100vw;height:100vh}i{font-style:normal}a{word-wrap:break-word;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:hover{text-decoration:none}.fade-enter-active,.fade-leave-active{transition:opacity .3s}.fade-enter,.fade-leave-to{opacity:0}.MathJax,.MathJax_CHTML,.MathJax_MathContainer,.MathJax_MathML,.MathJax_PHTML,.MathJax_PlainSource,.MathJax_SVG{outline:0}.ios-app-switch .js-audit{display:none}._loading_wrap_{position:fixed;width:100vw;height:100vh;top:50%;left:50%;transform:translate(-50%,-50%);z-index:999}._loading_div_class_,._loading_wrap_{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}._loading_div_class_{word-wrap:break-word;padding:.5rem .75rem;text-align:center;z-index:9999;font-size:.6rem;max-width:60%;color:#fff;border-radius:.25rem;-ms-flex-direction:column;flex-direction:column}._loading_div_class_ .message{color:#353535;font-size:16px;line-height:3}.spinner{animation:circle-rotator 1.4s linear infinite}.spinner *{line-height:0;box-sizing:border-box}@keyframes circle-rotator{0%{transform:rotate(0deg)}to{transform:rotate(270deg)}}.path{stroke-dasharray:187;stroke-dashoffset:0;transform-origin:center;animation:circle-dash 1.4s ease-in-out infinite,circle-colors 5.6s ease-in-out infinite}@keyframes circle-colors{0%{stroke:#ff5a05}to{stroke:#ff5a05}}@keyframes circle-dash{0%{stroke-dashoffset:187}50%{stroke-dashoffset:46.75;transform:rotate(135deg)}to{stroke-dashoffset:187;transform:rotate(450deg)}}.confirm-box-wrapper,.confirm-box-wrapper .mask{position:absolute;top:0;left:0;right:0;bottom:0}.confirm-box-wrapper .mask{background:rgba(0,0,0,.6)}.confirm-box-wrapper .confirm-box{position:fixed;top:50%;left:50%;width:267px;background:#fff;transform:translate(-50%,-50%);border-radius:7px}.confirm-box-wrapper .confirm-box .head{margin:0 18px;font-size:18px;text-align:center;line-height:65px;border-bottom:1px solid #d9d9d9}.confirm-box-wrapper .confirm-box .body{padding:18px;padding-bottom:0;color:#353535;font-size:12.5px;max-height:150px;overflow:auto}.confirm-box-wrapper .confirm-box .foot{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;padding:18px}.confirm-box-wrapper .confirm-box .foot .button-cancel{border:1px solid #d9d9d9}.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}




    </style>
<style type="text/css">
        .button-cancel[data-v-87ffcada]{color:#888;border:1px solid #888;border-radius:3px;margin-right:12px}.button-cancel[data-v-87ffcada],.button-primary[data-v-87ffcada]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;height:35px;display:inline-block;font-size:15px;text-align:center;line-height:36px}.button-primary[data-v-87ffcada]{color:#fff;background-color:#ff5a05;border-radius:3px}.pd[data-v-87ffcada]{padding-left:1.375rem;padding-right:1.375rem}.article[data-v-87ffcada]{max-width:70rem;margin:0 auto}.article .article-unavailable[data-v-87ffcada]{color:#fa8919;font-size:15px;font-weight:600;line-height:24px;border-radius:5px;padding:12px;background-color:#f6f7fb;margin-top:20px}.article .article-unavailable .iconfont[data-v-87ffcada]{font-size:12px}.article .main[data-v-87ffcada]{padding:1.25rem 0;margin-bottom:52px}.article-title[data-v-87ffcada]{color:#353535;font-weight:400;line-height:1.65rem;font-size:1.34375rem}.article-info[data-v-87ffcada]{color:#888;font-size:.9375rem;margin-top:1.0625rem}.article-content[data-v-87ffcada]{margin-top:1.0625rem}.article-content.android video[data-v-87ffcada]::-webkit-media-controls-fullscreen-button{display:none}.copyright[data-v-87ffcada]{color:#b2b2b2;padding-bottom:20px;margin-top:20px;font-size:13px}.audio-player[data-v-87ffcada]{width:100%;margin:20px 0}.to-comment[data-v-87ffcada]{overflow:hidden;padding-top:10px;margin-bottom:-30px}.to-comment a.button-primary[data-v-87ffcada]{float:right;height:20px;font-size:12px;line-height:20px;padding:4px 8px;cursor:pointer}.article-comments[data-v-87ffcada]{margin-top:2rem}.article-comments h2[data-v-87ffcada]{text-align:center;color:#888;position:relative;z-index:1;margin-bottom:1rem}.article-comments h2[data-v-87ffcada]:before{border-top:1px dotted #888;content:"";position:absolute;top:56%;left:0;width:100%;z-index:-1}.article-comments h2 span[data-v-87ffcada]{font-size:15.25px;font-weight:400;padding:0 1rem;background:#fff;display:inline-block}.article-sub-bottom[data-v-87ffcada]{z-index:10;cursor:pointer}.switch-btns[data-v-87ffcada]{height:76px;cursor:pointer;padding-top:24px;padding-bottom:24px;border-bottom:10px solid #f6f7fb;position:relative}.switch-btns[data-v-87ffcada]:before{content:" ";height:1px;background:#e8e8e8;position:absolute;top:0;left:0;-webkit-box-sizing:border-box;box-sizing:border-box;left:1.375rem;right:1.375rem}.switch-btns .btn[data-v-87ffcada]{height:38px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.switch-btns .btn .tag[data-v-87ffcada]{-webkit-box-flex:0;-ms-flex:0 0 62px;flex:0 0 62px;text-align:center;color:#888;font-size:14px;border-radius:10px;height:22px;line-height:22px;background:#f6f7fb;font-weight:400}.switch-btns .btn .txt[data-v-87ffcada]{margin-left:10px;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;color:#888;font-size:15px;height:22px;line-height:22px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400}@media (max-width:769px){.article .breadcrumb[data-v-87ffcada]{padding-top:10px;padding-bottom:10px}}





    </style>
<style type="text/css">
        .comment-item{list-style-position:inside;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;margin-bottom:1rem}.comment-item a{border-bottom:none}.comment-item .avatar{width:2.625rem;height:2.625rem;-ms-flex-negative:0;flex-shrink:0;border-radius:50%}.comment-item .info{margin-left:.5rem;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.comment-item .info .hd{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.comment-item .info .hd .username{color:#888;font-size:15.25px;font-weight:400;line-height:1.2}.comment-item .info .hd .control{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.comment-item .info .hd .control .btn-share{color:#888;font-size:.75rem;margin-right:1rem}.comment-item .info .hd .control .btn-praise{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:15.25px;text-decoration:none}.comment-item .info .hd .control .btn-praise i{color:#888;display:inline-block;font-size:.75rem;margin-right:.3rem;margin-top:-.01rem}.comment-item .info .hd .control .btn-praise i.on,.comment-item .info .hd .control .btn-praise span{color:#ff5a05}.comment-item .info .bd{color:#353535;font-size:15.25px;font-weight:400;white-space:normal;word-break:break-all;line-height:1.6}.comment-item .info .time{color:#888;font-size:9px;line-height:1}.comment-item .info .reply .reply-hd{font-size:15.25px}.comment-item .info .reply .reply-hd span{margin-left:-12px;color:#888;font-weight:400}.comment-item .info .reply .reply-hd i{color:#ff5a05;font-size:15.25px}.comment-item .info .reply .reply-content{color:#353535;font-size:15.25px;font-weight:400;white-space:normal;word-break:break-all}.comment-item .info .reply .reply-time{color:#888;font-size:9px}




    </style>
</head>
<body>
<div id="app">
<div class="article" data-v-87ffcada="" id="watermark">

<div class="main main-app" data-v-87ffcada="">
<h1 class="article-title pd" data-v-87ffcada="">
                01讲学编辑器，到底应该学什么
            </h1>
<div class="article-content typo common-content pd" data-v-87ffcada=""><img data-v-87ffcada="" src="https://static001.geekbang.org/resource/image/bf/cb/bff6d7c199712d992035a76d0f84aecb.jpg"/>
<div class="" data-v-87ffcada="" id="article-content">
<div class="text">
<p>你好，我是吕鹏，今天这篇文章是我们整个专栏的第一课，所以在这里我先向你问个好。我想在接下来的这三个月里，你我肯定是亦师亦友，共同切磋，一起进步。</p>
<p>极客时间团队经常提到一个词叫“学习路径”，我觉得特别有意思。同样，对于编辑器而言，我在开学第一课里，不应该深入到具体细节里，而是应该告诉你，怎么才能快速熟练掌握一个新的编辑器。</p>
<p>在我看来，编辑器的学习，和编程语言有一点类似。你当然可以找一本官方手册，从头到尾事无巨细全部学习一遍，这里面包括基本语法、数据类型、控制结构、函数、设计模式、框架等等。一开始在你不熟悉这门编程语言的时候，你可能会陷入到某一个语法的细节里很久不能自拔，但最后等你掌握了之后，你才发现，当初自学时自己纠结的点根本不影响大局，那些你当初认为重要的细节其实一点不那么重要。</p>
<p>在掌握了第一门编程语言之后，你想要学习另外一门新的编程语言，如果这个时候，你的学习路径还像学习第一门编程语言时那样，那我可以武断地说，你并没有从全局上理解这门编程语言，也没有在脑海中建立起“学习框架”。</p>
<p>怎么说呢？其实编程语言在设计上大同小异，新的编程语言往往都是在解决老的语言的某一个短板，但他们在最本质的设计上不会有大的变化。在有了这个框架之后，你再去学习，就不至于“拣了芝麻丢了西瓜”了。</p><!-- [[[read_end]]] -->
<p>同样，编辑器的学习，也和编程语言一模一样。</p>
<p>当使用一个工具时，你关心的应该是它能用来做什么，它最擅长做什么，以及它做不了什么，换句话说，就是这个工具的“下限”和“上限”。</p>
<p><strong>首先，我们一起来找下编辑器或者 IDE 的“下限”</strong>。一款开发工具的“下限”是由它默认自带的功能决定的，也就是它开箱即用时的体验。对于大部分用户而言，工具的“下限”也就决定了他们会不会马上卸载它。</p>
<ol>
<li><strong>快捷键的选用</strong></li>
</ol>
<p>说到编辑器的自带功能，你最先想到的肯定是代码编辑的快捷键，快捷键的设计直接决定着这个编辑器用起来是不是顺手，效率到底高不高。</p>
<p>我们先从编辑器开发者的角度来看这个点。一般来说，编辑器的开发者要尽可能保证这些快捷键的默认配置接近大家的使用习惯。比如 VS Code 在给新功能选择快捷键时，会先看看系统是不是有类似的功能，以及系统用的是哪个快捷键组合。</p>
<p>举个简单的例子，在 macOS 上，按住“Cmd +delete”就能够把当前行光标前的所有内容都删掉，如果我们在 VS Code 里给 “Cmd + delete”配上别的功能，用户可能就要生气地扔键盘了。</p>
<p>除了看系统上的惯用快捷键，开发工具之间也会互相参考。最后，也是最重要的一点，我们要看快捷键的配置是否有统一性。Shift 键能用于控制文本选择的，Ctrl 或者 Cmd 键能当做辅助键的，Tab 是用于在控件之间跳转的……也就是说，如果编辑器在选择快捷键的时候使用了某些规则，那么就要坚定地贯彻下去，否则就会给用户带来困扰。</p>
<p>理解了编辑器开发者实现快捷键特性的思路和出发点之后，你再来学习使用编程工具就有章法了。这里我再插一句，学习很多工具的时候，你都可以想想，如果你是设计者，你会怎么做，顺着这条主线去思考问题，你应该会更容易理解为什么是这个“现状”。</p>
<p>所以，对于快捷键的学习，你可以先看看默认的快捷键有哪些是标准的、主流的，快捷键之间有没有什么内在的规则。然后，你还要试着找出快捷键的分类方式。毕竟功能总是比键帽的数量多，所以能够把这么多功能映射成快捷键本身就是门学问，了解了这门学问后，你再来掌握所用编辑器的快捷键，就会轻松很多。</p>
<p>VS Code 的做法是搭配组合辅助键 Ctrl、Alt 和 Meta 键，然后根据当前用户正在使用的组件来决定是什么功能；Vim 则是运用了“模态”的概念，把输入文本信息，和光标移动、文本操作等分开为不同的模态，不同模态各有一套自己的快捷键。大家都说 Vim 的学习曲线比较陡峭，一个很重要的原因就是“模态”的概念实在是另辟蹊径。</p>
<p>就我和很多编辑器爱好者的交流来看，掌握一套设计良好的快捷键，是折腾编辑器的过程中最划算的投资。大部分编辑器都支持自定义快捷键，这样你就可以一直使用自己熟悉的那一套了。</p>
<p>Vim 都快30岁了，现在哪个开发工具要是说没法支持 Vim 的操作方式，那真的会相形见绌。投资一种高效的快捷键操作，花点时间让它成为你的肌肉记忆，然后用30年，这样你的整个职业生涯都会受益。</p>
<ol start="2">
<li><strong>编程语言与框架支持</strong></li>
</ol>
<p>除了快捷键，另外一个决定着编辑器“下限”的就是编程语言和框架的支持了。前面我提到过，我们需要根据编程语言来选择相应的编辑器。</p>
<p>如果你得写 iOS 应用，绝大多数情况要用 Objective-C 或者 Swift，那你很难脱离 Xcode；如果公司是用 <a href="http://ASP.NET">ASP.NET</a>，你需要写 C#，Visual Studio 就是现成最好的IDE；但如果你们用 Ruby on Rails 做网站，而 Ruby 社区又没有钦定的官方开发工具，Vim、TextMate、RubyMine 这些都有人使用，各有各的特点，你从中选择一款就可以。</p>
<p>因此，当你去考察一个新的编辑器时，就需要看它对你必须使用的编程语言的支持情况如何，语法高亮是否正确，是否有自动补全功能，能否直接调试和运行测试。你甚至需要研究怎么让它支持你电脑上特殊的环境变量，怎么更好地和你们使用的框架集成，这些就是你要付出的学习成本。</p>
<ol start="3">
<li><strong>对工作流的选择和支持</strong></li>
</ol>
<p>最后一个影响因素，就是编辑器对工作流的选择和支持。工作流的选择，既是态度，又非常能够体现时代背景和行业现状。</p>
<p>好比说 Vim 并不自带资源管理器，如果你希望在 Vim 里看到文件树并快速浏览切换文件，就需要安装额外的插件。现在软件开发工程化比较成熟了，开发工具也都直接集成了资源管理器；VS Code 自带了版本管理，可以说是对版本管理在软件开发过程中的重要地位的一种认同；但有些开发工具把测试功能集成了进去，这个就见仁见智了，并不是谁都认为代码测试是日常开发工作的必要一环。</p>
<p>在我看来，这是学习和比较开发工具的过程中最有趣的一部分，甚至像“该选编辑器还是IDE”这样的问题，都能在这里找到答案。</p>
<p><strong>说完“下限”，我们再接着来说说编辑器的“上限”</strong>。如果编辑器支持用户写插件来定制功能，那它的“上限”就很高了。像 Emacs、Eclipse 和 Atom 这样允许修改任意功能的工具来说，它们的“上限”理论上是无限的。但扩展编辑器这个事情，由于最终还是要落实到社区和个人，真正能达到的高度就很难说了。</p>
<p>Eclipse 是最流行的 Java IDE 之一，插件开发的语言也是 Java ，所以它的插件社区也是非常火爆。但是 Eclipse 把插件运行在主进程中，一旦插件的性能堪忧，就会影响到 Eclipse 本身的体验。</p>
<p>Atom 和 VS Code 的插件开发语言都是 JavaScript，可以说写扩展对于很多人是没有门槛的，因为大家多少都会写一些 JavaScript。从这个角度看，对于 Atom 和 VS Code 这类基于浏览器和 JavaScript 引擎的编辑器，插件社区的活跃度是不用担心的，主要还是要考虑如何避免跳进 Eclipse 的坑里。</p>
<p>而Emacs 的插件语言是 Lisp 方言，Vim 则是使用自己的VimL，语言相对小众一些，对于很多人而言成本就高了一截。</p>
<p>上面我说了很多关于编辑器“上限”和“下限”，其实这也就是我学习新编辑器时会着重研究的方向。在研究时，其实我有个“三步走”的演变过程，也就是极客时间团队提到的学习路径：</p>
<ul>
<li>最开始的时候，我特别关心快捷键和语言支持，在这上面花了很多时间，这个过程就像是打怪升级，不断更新自己的装备库；</li>
<li>再往后，我就会开始挑剔编辑器的其他组件，但凡是跟自己的工作习惯或者工作流不匹配的，就会想办法换掉它，这是个做减法的过程；</li>
<li>最后一步，就是自己学习写插件了，编辑器本身的功能和社区不能够完全满足自己的需求，本着“麻烦别人不如磨炼自己”的精神，我开始自己动手。</li>
</ul>
<p>当然，一个人的兴趣点和精力都是有限的，任何事都没办法一蹴而就，因此有的放矢才是精进的关键。</p>
<p>我的建议是这样的，快捷键的学习是值得多花时间的；语言的支持方面，如果你是初学者，我不太建议使用一款什么都得自己配置的编辑器，把时间放在这上面不太划算（通常来说，语言或者框架作者推荐啥我就先用啥，等经验丰富了，再去研究那些更灵活的编辑器，才更游刃有余）；至于工作流这块，选择“有态度的”编辑器可能会更好一些，一款流行且社区活跃的编辑器推崇的工作流，大概率上是经得起工程上的考验的。</p>
<p>而插件开发的学习，既可以当做语言的学习，也能够当做业余项目，还能够锻炼跟社区的沟通能力，每个人都值得尝试。我在开发 VS Code 和一些插件的时候，就认识了不少朋友，这些人都非常优秀，也一直激励和影响着现在的我。</p>
<p>以上就是我在学习编辑器时的一些感悟，以及对于怎么学习编辑器、该学什么的一点看法，希望对你的编辑器探索之路有所帮助。当然，学习没有捷径，最重要的永远是立刻动手。</p>
<p>最后，也欢迎你在留言区和我分享你的编辑器学习经验，也许你会比我更高明。</p>
<hr/>
<p><img alt="" src="https://static001.geekbang.org/resource/image/92/06/92862660523add24b3168f22954fa506.jpg"/></p>
</div>
</div>
</div>
<div class="article-comments pd" data-v-87ffcada=""><h2 data-v-87ffcada=""><span data-v-87ffcada="">精选留言</span></h2>
<ul data-v-87ffcada="">
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/11/9d/93/945393c1.jpg"/>
<div class="info">
<div class="hd"><span class="username">不做键盘侠</span>
</div>
<div class="bd">meta键是什么键？ <br/></div>
<span class="time">2018-09-13 15:17</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/11/b7/f6/4e1e20db.jpg"/>
<div class="info">
<div class="hd"><span class="username">Ethan_zyc</span>
</div>
<div class="bd">VS Code 适合开发 Java 吗，现在还是乖乖用的 JetBrains 的 IDEA <br/></div>
<span class="time">2018-09-13 11:58</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/10/49/2c/b920ea41.jpg"/>
<div class="info">
<div class="hd"><span class="username">A2020</span>
</div>
<div class="bd">学习新的编辑器，优先了解它的“下限”和“上限”，了解过程分三步走。<br/>第一步：了解编辑器的快捷键和语言支持，快捷键值得多花时间；<br/>第二步：开始挑剔编辑器的其他组件，但凡是跟自己的工作习惯或者工作流不匹配的，就会想办法换掉它，这是个做减法的过程；<br/>第三步：最后一步，就是自己学习写插件了，编辑器本身的功能和社区不能够完全满足自己的需求，本着“麻烦别人不如磨炼自己”的精神，我开始自己动手。<br/><br/>“三步走”的演变过程，作为一个通用的学习新工具的方法是我在本篇文章中的最大收获。 <br/></div>
<span class="time">2018-09-14 09:41</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/10/df/6e/267bd6ee.jpg"/>
<div class="info">
<div class="hd"><span class="username">1900</span>
</div>
<div class="bd">VS Code适合开发Go么？若适合，希望老师在以后的课程中可以详细讲解下相关配置，很期待后面的课程。 <br/></div>
<span class="time">2018-09-13 09:51</span>
<div class="reply">
<div class="reply-hd"><span>作者回复</span></div>
<p class="reply-content">VSCode 是谷歌 Go 团队官方推荐的编辑器，这个你放心使用好了</p>
<p class="reply-time">2018-09-13 10:51</p>
</div>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/12/c6/ab/30f26137.jpg"/>
<div class="info">
<div class="hd"><span class="username">Nevea</span>
</div>
<div class="bd">关于下限 VScode的自动补全貌似不如Atom，shell就没有补全 写个if for都要自己打出来 安装了一个shell Snippet也不理想，是不是VScode没有关注shell啊 或者我哪里没有设置好  <br/></div>
<span class="time">2018-09-13 15:40</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src=""/>
<div class="info">
<div class="hd"><span class="username">fisher</span>
</div>
<div class="bd">vim不是用lisp做扩展吧？ <br/></div>
<span class="time">2018-09-13 07:53</span>
<div class="reply">
<div class="reply-hd"><span>作者回复</span></div>
<p class="reply-content">谢谢指正，Vim 使用自己的 Viml 不是 lisp dialect</p>
<p class="reply-time">2018-09-13 10:54</p>
</div>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/0f/a5/f7/0263a8e2.jpg"/>
<div class="info">
<div class="hd"><span class="username">A_Elite</span>
</div>
<div class="bd">meta键是mac上的，windows是win键 <br/></div>
<span class="time">2018-09-14 21:15</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/11/b4/9a/17309b19.jpg"/>
<div class="info">
<div class="hd"><span class="username">Moorez</span>
</div>
<div class="bd">老师，vscode编辑器有时候很卡是什么原因 就是文件数多的时候，会不会是插件造成卡得原因，换成 webstorm 就不会卡了？您有没有遇到过这样的情况？ <br/></div>
<span class="time">2018-09-14 13:06</span>
<div class="reply">
<div class="reply-hd"><span>作者回复</span></div>
<p class="reply-content">是打字都会卡吗？那就问题大了，欢迎提供更多细节</p>
<p class="reply-time">2018-09-18 11:08</p>
</div>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/11/2c/a2/def0bf4d.jpg"/>
<div class="info">
<div class="hd"><span class="username">李思阳</span>
</div>
<div class="bd">想问下老师，使用vscode进行c++和shell的系统开发合适吗？ <br/></div>
<span class="time">2018-09-14 06:07</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/11/4f/ba/6cefa19a.jpg"/>
<div class="info">
<div class="hd"><span class="username">昂头的笑脸</span>
</div>
<div class="bd">如果vscode很好的支持vim，可以考虑切换 <br/></div>
<span class="time">2018-09-13 13:43</span>
<div class="reply">
<div class="reply-hd"><span>作者回复</span></div>
<p class="reply-content">有几个 Vim 的插件，我是其中一个的 maintainer ，这几个插件各有千秋</p>
<p class="reply-time">2018-09-18 11:12</p>
</div>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/0f/bf/d8/09d678a6.jpg"/>
<div class="info">
<div class="hd"><span class="username">大鹏</span>
</div>
<div class="bd">吕老师，课程中提到的vscode的插件开发受编程语言限制吗？是否需要提前具备typescript基础？ <br/></div>
<span class="time">2018-09-13 11:17</span>
<div class="reply">
<div class="reply-hd"><span>作者回复</span></div>
<p class="reply-content">需要 JavaScript 的知识储备</p>
<p class="reply-time">2018-09-18 11:13</p>
</div>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/0f/57/4f/6fb51ff1.jpg"/>
<div class="info">
<div class="hd"><span class="username">一步</span>
</div>
<div class="bd">Vscode的快捷键可以json文件的格式快速导入导出吗？ <br/></div>
<span class="time">2018-09-13 11:11</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/12/ca/b7/5c451afd.jpg"/>
<div class="info">
<div class="hd"><span class="username">QS</span>
</div>
<div class="bd">VS code的快捷键还是很符合使用习惯的，上手很快，也不与系统冲突。在我用过的IDE和编辑器中，比较奇葩的快捷键设置应该是jetBrains系列IDE：默认设置下，Ctrl＋Y键是删除行，而不是恢复上一步操作；不熟悉的情况下就容易造成误删（幸好Ctrl＋Z是正常的），所以我觉得在快捷键设置上下功夫确实很重要。 <br/></div>
<span class="time">2018-09-13 01:49</span>
<div class="reply">
<div class="reply-hd"><span>作者回复</span></div>
<p class="reply-content">只要能够允许修改快捷键绑定，就还是可以的</p>
<p class="reply-time">2018-09-13 08:54</p>
</div>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/11/b3/a8/f74d604a.jpg"/>
<div class="info">
<div class="hd"><span class="username">鹏</span>
</div>
<div class="bd">学习了 <br/></div>
<span class="time">2018-10-01 20:11</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src=""/>
<div class="info">
<div class="hd"><span class="username">张柏林</span>
</div>
<div class="bd">划重点 <br/></div>
<span class="time">2018-10-01 19:11</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/11/12/0f/4d38a315.jpg"/>
<div class="info">
<div class="hd"><span class="username">夏日朝阳</span>
</div>
<div class="bd">老师的方法论写的很好，受教了 <br/></div>
<span class="time">2018-09-17 11:38</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/12/cf/5f/8b69cda3.jpg"/>
<div class="info">
<div class="hd"><span class="username">忘詞。</span>
</div>
<div class="bd">能出个教程用VSCode调试Golang就最好了 <br/></div>
<span class="time">2018-09-15 16:20</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/12/c5/85/2651f4dd.jpg"/>
<div class="info">
<div class="hd"><span class="username">谢mingmin</span>
</div>
<div class="bd">在写一个串口扩展插件，很期待后面的文章😁  <br/></div>
<span class="time">2018-09-14 12:43</span>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/12/c7/68/04b3b8a6.jpg"/>
<div class="info">
<div class="hd"><span class="username">mcintype</span>
</div>
<div class="bd">右边编辑区选中文件时，左边的文件树会Focus到当前编辑的文件，无论是vscode还是基于vscode的其它编辑器都这样！文件树这边跳来跳去展开文件夹带来烦恼，eclipse是可以做到的，vscode如何设置？ <br/></div>
<span class="time">2018-09-14 07:54</span>
<div class="reply">
<div class="reply-hd"><span>作者回复</span></div>
<p class="reply-content">你需要的是 explorer.autoReveal</p>
<p class="reply-time">2018-09-18 11:12</p>
</div>
</div>
</li>
<li class="comment-item" data-v-87ffcada=""><img class="avatar" src="https://static001.geekbang.org/account/avatar/00/11/f9/ad/3fa5756f.jpg"/>
<div class="info">
<div class="hd"><span class="username">Senhor</span>
</div>
<div class="bd">我居然还没能用它启动过一个java项目，需要配置的东西有点多 <br/></div>
<span class="time">2018-09-14 01:50</span>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
</body>
</html>